package com.zhiyu.utils;

import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Slf4j
public class DateUtil extends org.apache.commons.lang.time.DateUtils {

    /**
     * 获取系统当前时间毫秒数
     * @return
     */
    public static Long getCurrentTime() {
        return System.currentTimeMillis();
    }

    /**
     * 获取系统当前时间
     * @return
     */
    public static Date getCurrentDate() {
        return Calendar.getInstance().getTime();
    }

    /**
     * 获取系统当前时间毫秒数
     * @return
     */
    public static Long getTime(Date date) {
        return date.getTime();
    }

    /**
     * 日期、时间格式化
     * @param date Date 将要被格式化的日期对象
     * @param outFmt String 返回样式，参照类说明，如：yyyy年MM月dd日
     * @return String 格式化后的日期、时间字符串
     */
    public static String getDateFormat(Date date, String outFmt) {
        if (null == date) {
            return null;
        }
        if (null == outFmt || "".equals(outFmt.trim())) { // outFmt非法
            outFmt = "yyyyMMdd";
        }
        String retu = null;
        SimpleDateFormat dateFormat = null;
        try {
            dateFormat = new SimpleDateFormat(outFmt);
        } catch (IllegalArgumentException e) { // outFmt非法
            dateFormat = new SimpleDateFormat("yyyyMMdd");
        }
        retu = dateFormat.format(date);
        return retu;
    }

    /**
     * 根据inFmt的样式，日期时间字符串转化为日期时间对象
     * @param dateStr String 日期时间字符串，如：20041001、2004年10月01日 15:03
     * @param inFmt String 对dateStr参数格式说明，参照类说明，如yyyyMMdd、yyyy年MM月dd日 HH:mm
     * @throws ParseException 当dateStr不能格式化为inFmt格式时抛出此异常
     * @return Date 日期时间对象，格式inFmt非法时，使用yyyyMMdd格式
     */
    public static Date getDate(String dateStr, String inFmt) throws ParseException {
        if (null == dateStr || "".equals(dateStr.trim())) {
            return null;
        }
        if (null == inFmt || "".equals(inFmt.trim())) { // inFmt非法
            inFmt = "yyyyMMdd";
        }
        Date inDate = null;
        // 依据inFmt格式把日期字符串转化为日期对象
        SimpleDateFormat inDateFormat = new SimpleDateFormat(inFmt);
        inDateFormat.setLenient(true);
        inDate = inDateFormat.parse(dateStr);
        return inDate;
    }

    /**
     * 查询指定日期为星期几
     * @param date
     * @return
     */
    public static String getWeekDay(Date date) {
        String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0) {
            w = 0;
        }
        return weekDays[w];
    }

    /**
     * 计算指定日期到今天的天数
     * @param beginDate
     * @return
     * @throws ParseException
     */
    public static Long betweenDay(String beginDate) throws ParseException{
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date cDate = df.parse(beginDate);
        Date dDate = new Date();
        return (dDate.getTime()-cDate.getTime())/(24*60*60*1000);
    }

    /**
     * 日期转换为指定格式的字符串
     * @param date
     * @param dateFormat
     * @return
     */
    public static String dateToStr(Date date, String dateFormat){
        if(date == null){
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        return sdf.format(date);
    }

    /**
     * 获取指定日期的几天前日期
     * @param d
     * @param day
     * @return
     */
    public static String getDateBefore(Date d,int day){
        Calendar now =Calendar.getInstance();
        now.setTime(d);
        now.set(Calendar.DATE,now.get(Calendar.DATE)-day);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(now.getTime());
    }

    /**
     * 将生日存储的时间格式转化为年龄（周岁，小数点后不计）
     * @param birthdayStr 生日字段 yyyy-mm-dd
     * @return 年龄
     */
    public static String birthdayToAge(String birthdayStr) {
        if (birthdayStr == null || birthdayStr.length() < 6) {
            return "";
        } else {
            int birthYear = Integer.parseInt(birthdayStr.substring(0, 4));
            int birthMonth = Integer.parseInt(birthdayStr.substring(4, 6));
            Calendar cal = new GregorianCalendar();
            int currYear = cal.get(Calendar.YEAR);
            int currMonth = cal.get(Calendar.MONTH);
            int age = currYear - birthYear;
            age -= (currMonth < birthMonth) ? 1 : 0;
            return DataUtil.asString(age);
        }
    }
    
     public static void main(String[] args) throws ParseException {

     }
}

